iT邦幫忙

3

JavaScript 陣列方法 filter(篩選)、map(對映)、forEach(遍歷)、reduce(縮減/累加)。

  • 分享至 

  • xImage
  •  

forEach() (遍歷)

for有對於的意思,each有每個的意思,合起來就是對於每個的意思。

語法:

array.forEach(callback(currentValue, index, array), thisArg)

例子:

const arr = [1, 2, 3]; arr.forEach((value, index) => 
{ console.log(`索引 ${index} 的值是 ${value}`); });
//索引 0 的值是 1
//索引 1 的值是 2
//索引 2 的值是 3

裡面可放兩個參數callback(回呼函式)、thisArg(this引數),而thisArg的「Arg」是英文 Argument 的縮寫。

第一個參數是一個回呼函式callback(currentValue, index, array)。
裡面可以放三個參數,currentValue(目前值)、index(索引)、array(陣列,forEach()方法被呼叫時所作用的陣列)。最少必須放一個currentValue參數。

第二個參數thisArg。
是this Argument 的縮寫,可以把它想像成是把某個函式、物件、值,綁定成forEach()裡第一個參數回呼函式裡的this值。告訴 JavaScript 引擎,在執行回呼函式 (callback) 時,應該將 this 關鍵字的值設定為誰。

用途: 對陣列中的每個元素執行一個提供的函式。
回傳值: undefined(它不接受回呼函式的回傳值,也不會回傳一個新陣列,也不會改變原始陣列)。
使用時機:對每個值執行某些事情,且沒有要使用回傳值。
注意事項:forEach 不能改變陣列的長度。但可以改變陣列中物件內部的屬性。

reduce() (縮減/累加)

這方法的名字意思可以從兩個觀點來看。
1.縮減:將多個元素透過某種運算,最終變成一個結果。
2.累加(有誤導性):當每個人剛學習接觸到這個用法的時候,大部分都是加法來累加,計算總合。但其實你可以用乘法、減法、計算平均值、陣列轉物件、陣列轉物件...等等。

語法:array.reduce(callback(accumulator, currentValue, index, array), initialValue)

第一個參數回呼函式callback(accumulator, currentValue, index, array)。
回呼函式callback裡可放四個參數。
accumulator (累加器): 最重要的參數,儲存了前一次回呼函式執行的結果。
currentValue (目前值):正在被處理的陣列元素。
index (索引):目前正在處理的元素的索引值(從 0 開始)。
array (陣列):reduce 方法被呼叫時所作用的完整原始陣列。

第二個參數initialValue (初始值): 可選的第二個參數,設定累加器在第一次執行時的起始值。

例子:

const numbers = [10, 5, 2];

// 範例使用了 initialValue = 0 (起始值為 0)
const sum = numbers.reduce((accumulator, currentValue) => {
  // 這裡的運算邏輯是:累加器 + 當前值
  return accumulator + currentValue;
}, 0); // <-- 這裡的 0 是 initialValue (初始值)

console.log(sum); // 輸出: 17

運作步驟:
第一次執行,accumulator為0 (初始值),currentValue為10,回傳值(新的 accumulator)0+10=10。
第二次執行,accumulator為10 (初始值),currentValue為5,回傳值(新的 accumulator)10+5=15。
第三次執行,accumulator為15 (初始值),currentValue為2,回傳值(新的 accumulator)15+2=17。
reduce會自動傳遞並更新了這個 accumulator (累加器) 的值。

用途:將陣列的所有元素縮減成一個單一值。
回傳值:執行後的單一值。
使用時機:對每個值執行某種算法,只想要有單一值,並不想要陣列。
為何不使用一般function,要用reduce?:
這兩種function看起來一樣是函式,除了裡面放的參數效果不同以外,return的規則也略有不同。
一般function只要區塊裡面有使用return後,就會把整個function當作執行結束,並把這個return回傳值當成是這個function執行結果的值。但reduce這個function,在回呼函式內區塊裡寫return,如果當下不是執行到最後的陣列的值(reduce的特性是,每一個值,照此陣列索引順序各別執行一次你在reduce()裡的回呼函式區塊{}中的步驟),它並不會把這個return當成reduce執行結果的值,而是把這個值當成下一輪的起始值回傳給reduce,再繼續把陣列中的下一個值跟起始值,去做你寫的回呼函式區塊當中的步驟,直到把陣列中的最後一個值執行完畢後,才會把這個結果當成是reduce執行結果的值。

map() (對映)

將陣列中的每個值執行一個函式,並把結果產出一個新的陣列。執行map()後產生的新陣列,與未執行map()前的陣列有一定的關係,可能是加法關係、減法關係、乘法關係...等等。

語法:

const newArray = arr.map((currentValue, index, array) => {
return transformedValue;
});

例子:

const Prices = [100, 50, 200];

// 使用 map 創建一個新的陣列,其中每個元素都是原始元素的兩倍
const doublePrices = Prices.map((price) => {
  // 回傳的結果就是新陣列中對應位置的值
  return price * 2;
});

console.log(doublePrices);     // 輸出: [200, 100, 400]
console.log(Prices);   // 輸出: [100, 50, 200] (原始陣列沒有改變)

用途: 對陣列的每個元素使用回呼函式後的值,產出新的陣列。
回傳值:新的陣列。
使用時機:對每個值執行某種算法,並想要回傳值為新的陣列。
是否改變原本陣列:不改變原始陣列。

filter() (篩選)

有些人也會叫做過濾,我覺得兩者都很適合,怎麼叫都可以。
會根據你的條件函式,來回傳結果為true的值。若無值,則回傳[]空陣列。

語法:
const newArray = arr.filter(callback(currentValue, index, array))
例子:

const numbers = [10, 5, 20]; const bigNumbers = numbers.filter(num => num > 10); 
// bigNumbers 為 [20]

用途: 對陣列的每個值執行回呼函式,回呼函式可以包含任何程式碼邏輯,但它最後的 return 語句必須產生一個布林值。
回傳值:經過執行回呼函式後,得到符合條件的新陣列結果。
使用時機:從現有陣列中,創建一個只包含符合特定條件元素的新陣列。

注意事項:
map()、filter()、reduce():它們都是不可變 (Immutable) 的方法,它們不會改變原始陣列。
forEach():本身不會改變陣列結構,但可以在內部改變陣列裡面的物件內容)。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言